import {asyncRouterMap, constantRouterMap} from '@/router'

/**
 * 通过meta.role判断是否与当前用户权限匹配
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
	let res = false;
	try {
		if (route.meta && route.meta.roles) {
			if (route.meta.roles.length > 0) {
				for (let r of route.meta.roles) {
					if (r.toUpperCase() == roles.toUpperCase()) {
						res = true;
						break;
					}
				}
			}
		} else {
			res = roles && roles != null && roles != "";
		}
	} catch (e) {
		console.log(e);
		res = false;
	}
	return res;
}

/**
 * 递归过滤异步路由表，返回符合用户角色权限的路由表
 * @param asyncRouterMap
 * @param roles
 */
function filterAsyncRouter(asyncRouterMap, roles) {
	const accessedRouters = asyncRouterMap.filter(route => {
		if (hasPermission(roles, route)) {
			if (route.children && route.children.length) {
				route.children = filterAsyncRouter(route.children, roles)
			}
			return true
		}
		return false
	})
	return accessedRouters
}

const permission = {
	state: {
		routers: constantRouterMap,
		addRouters: []
	},
	mutations: {
		SET_ROUTERS: (state, routers) => {
			state.addRouters = routers
			state.routers = constantRouterMap.concat(routers)
		}
	},
	actions: {
		GenerateRoutes({commit}, roles) {
			return new Promise(resolve => {
				let accessedRouters
				if (roles.toUpperCase().indexOf('Admin'.toUpperCase()) >= 0) {
					accessedRouters = asyncRouterMap
				} else {
					accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
				}
				commit('SET_ROUTERS', accessedRouters)
				resolve()
			})
		}
	}
}

export default permission
